package model;

import java.io.File;
import util.Constantes;
import bean.DadosEntradaRNA;
import bean.PacoteF;

public class ProcessaInfoPerfil {

	int[] MAXIMOS_ARRAY = new int[Constantes.INPUT_COUNT + Constantes.OUTPUT_COUNT];

	
	public void executa(RegistroPerfilMagnetico registro){
		DadosEntradaRNA entradaRNA = registro.geraDadosEntradaRNA();
		
		if(entradaRNA == null){
			System.err.println("Fluxo Nulo ou menor 1!");
			return;
		}
				
		gravarDadosEntradaRNAemArquivoCSV(
				Constantes.DIRETORIO_PERFIL_TESTES_METROLOGICO_COLETA_DADOS, registro, entradaRNA);
		salvaMaximos(MAXIMOS_ARRAY, entradaRNA);				
		
		//salva fluxo normalizado
		gravarPerfilMagneticoEmArquivoTexto(registro);
	}
	
	private void gravarPerfilMagneticoEmArquivoTexto(
			RegistroPerfilMagnetico registro) {
		
		File caminho = new File(Constantes.DIRETORIO_PERFIL_TESTES_METROLOGICO_FLUXO_NORMALIZADO, 
				registro.getPacoteE().getPacoteString() + Constantes.EXTENSAO_TXT);
		
		StringBuffer stringBuffer = new StringBuffer();		
		stringBuffer.append(registro.getPacoteT().getPacoteString() + "\n");
		
		for (PacoteF fluxoMagnetico : registro.getFluxos()) {
			stringBuffer.append(fluxoMagnetico.getPacoteString() + "\n");
		}
		
		stringBuffer.append(registro.getPacoteE().getPacoteString() + "\n");
		
		OperacoesArquivos.salvaDadosArquivoTexto(stringBuffer.toString(), caminho.getAbsolutePath(), false);
	}
	
	private void gravarDadosEntradaRNAemArquivoCSV(File diretorio, 
			RegistroPerfilMagnetico registro, DadosEntradaRNA entradaRNA) {
						
        if(isDiretorioExiste(diretorio)){
//        	String linha = geraLinhaStrBuffer(registro.getDadosEntradaRNA());
        	String linha = geraLinhaStrBuffer(entradaRNA);
        	
        	String nomeDoArquivo = registro.getPacoteE().getPacoteString() + Constantes.EXTENSAO_CSV;
    		File arquivoCSV = new File(diretorio, nomeDoArquivo);
    		
    		OperacoesArquivos.salvaDadosArquivoTexto(linha, arquivoCSV.getAbsolutePath(), false);
        } else{
        	System.err.println("Nao foi possivel criar o diretorio: " + diretorio);
        }
	}
	
	private void salvaMaximos(int[] maximos, DadosEntradaRNA input) {
		getArrayMaximos(maximos, input);
		String linhaMaximos = geraLinha(maximos);
		OperacoesArquivos.salvaDadosArquivoTexto(linhaMaximos, Constantes.MAXIMOS_CSV.getAbsolutePath(), false);		
	}
	
	private String geraLinha(int[] maximos){
		StringBuffer novaLinha = new StringBuffer();
		String separador = ",";
		
		for (int i = 0; i < maximos.length; i++) {
			novaLinha.append(maximos[i]);
			
			if(i != maximos.length - 1){
				novaLinha.append(separador);
			}
		}
		
		return novaLinha.toString();
	}
	
	private void getArrayMaximos(int[] maximos, DadosEntradaRNA input){
		if(input.getMa() > maximos[0]){
			maximos[0] = input.getMa();
		} if(input.getMb() > maximos[1]){
			maximos[1] = input.getMb();
		} if(input.getAa() > maximos[2]){
			maximos[2] = input.getAa();
		} if(input.getAb() > maximos[3]){
			maximos[3] = input.getAb();
		} if(input.getTa() > maximos[4]){
			maximos[4] = input.getTa();
		} if(input.getTb() > maximos[5]){
			maximos[5] = input.getTb();
		} if(input.getTd() > maximos[6]){
			maximos[6] = input.getTd();
		} if(input.getNa() > maximos[7]){
			maximos[7] = input.getNa();
		} 
//		if(input.getNb() > maximos[8]){
//			maximos[8] = input.getNb();
//		} 
		if(input.getSaidaIdeal() > maximos[8]){
			if(input.getSaidaIdeal() > 4){
				input.setSaidaIdeal(4);
			}
			maximos[8] = (int) (input.getSaidaIdeal());
		}
		
//		return maximos;
	}
	
	private String geraLinhaStrBuffer(DadosEntradaRNA input){
		StringBuffer novaLinha = new StringBuffer();
		String separador = ",";
		
		novaLinha.append(input.getMa());
		novaLinha.append(separador);
		novaLinha.append(input.getMb());
		novaLinha.append(separador);
		novaLinha.append(input.getAa());
		novaLinha.append(separador);
		novaLinha.append(input.getAb());
		novaLinha.append(separador);
		novaLinha.append(input.getTa());
		novaLinha.append(separador);
		novaLinha.append(input.getTb());
		novaLinha.append(separador);
		novaLinha.append(input.getTd());
		novaLinha.append(separador);
		novaLinha.append(input.getNa());
		novaLinha.append(separador);
		novaLinha.append((int) (input.getSaidaIdeal()));
                           
        return novaLinha.toString();
	}
	
	private boolean isDiretorioExiste(File diretorio) {		
		if(!diretorio.exists()){			
			boolean sucess = diretorio.mkdir();
			if(sucess){
				return true;
			} 
		} else{
			return true;
		}
		return false;
	}
}
